package com.ytf.test.fifth;

/**
 * @author: YTF
 * @date: 2024/9/20 18:21
 * @version: 1.0
 * @description:
 */
public class VarargType {
    static void f(Character... args){
        System.out.print("f: ");
        System.out.print(args.getClass());
        System.out.println(" length "+args.length);
    }
    static void g(int... args){
        System.out.print("g: ");
        System.out.print(args.getClass());
        System.out.println(" length "+args.length);
    }
    public static void main(String[] args) {
        f();
        f('a');
        f('a','b');
        g();
        g(1);
        g(1,2);
        /**
         * Output:
         * f: class [Ljava.lang.Character; length 1
         * f: class [Ljava.lang.Character; length 0
         * g: class [I length 1
         * g: class [I length 0
         * 总结:
         *  可变参数列表 int... 使用过程中需要考虑其他情况,可能会出现找不到引用方法的情况。
         *  在下面两个类演示错误情况和使用方式 OverloadingVarargs2 OverloadingVarargs3
         *  应该不用或者在需要重载方法时添加非可变参数用于区分方法。
         */
        OverloadingVarargs2.main(new String[0]);
        OverloadingVarargs3.main(new String[0]);
    }
}
class OverloadingVarargs2{
    static void f(Character... args){
        System.out.println("f(Character... args) ");
    }
    static void f(int i,Character... args){
        System.out.println("f(String s,Character... args) ");
    }
    public static void main(String[] args) {
        //! f('a','b');
        f(1,'b');
        /**
         * Output:
         * java: 对f的引用不明确
         *   com.ytf.test.fifth.OverloadingVarargs2 中的方法 f(java.lang.Character...) 和 com.ytf.test.fifth.OverloadingVarargs2 中的方法 f(int,java.lang.Character...) 都匹配
         *
         */
    }
}
class OverloadingVarargs3{
    static void f(int i,Character... args){
        System.out.println("f(int i,Character... args) ");
    }
    static void f(String s,Character... args){
        System.out.println("f(String s,Character... args) ");
    }
    public static void main(String[] args) {
        f(1,'b');
        f("string",'b');
        /**
         * Output:
         * f(int i,Character... args)
         * f(String s,Character... args)
         */
    }
}